package com.lock.reentrantLock;

/**
 * @PackageName:com.lock
 * @ClassName:Test
 * @Description: 演示锁的可重入性
 * @Author: zhangxiaoyu
 * @date 2021/1/19 15:45
 */
public class Test {

    public  synchronized  void sm1(){
        System.out.println("同步方法1");
        //线程执m1方法，默认this作为锁对象，在m1方法中调用了m2方法，注意当前线程还是持有this锁对象的
        //在sm2方法中，默认的锁对象也是this对象，要执行m2方法必选先获得this锁对象，当前this锁对象被当前线程持有，可以再次获得this对象
        //这就是锁的可重入性
        //假设锁不可重入的话，可能会造成死锁
        sm2();
    }

    private synchronized  void sm2(){
        System.out.println("同步方法2");
        sm3();
    }
    
    private  synchronized  void sm3(){
        System.out.println("同步方法3");
    }
    
    public static void main(String[] args){

        Test t1 = new Test();

        new Thread(new Runnable() {
            @Override
            public void run() {
                t1.sm1();
            }
        }).start();

    }
}
